Manon.icu

I'm here to make you a better developer by teaching you everything I know about building for the web.

Published 2022-06-14

Postgresql - FULL OUTER JOIN

在 Postgresql 中,FULL OUTER JOIN 是一种结合左外连接和右外连接结果的连接类型。它返回左表中的所有行和右表中的所有行,包括在 ON 子句中不匹配的行。FULL OUTER JOIN 在想要在最终结果集中包含两个表中不匹配的行时非常有用。

以下查询使用INNER JOIN表连接到自身的查询

SELECT select_list
FROM table_name t1
INNER JOIN table_name t2 ON join_predicate;

此外还可以使用LEFT JOINRIGHT JOIN将表连接到自身:

SELECT select_list
FROM table_name t1
LEFT JOIN table_name t2 ON join_predicate;

示例

查询分层数据

假设有以下组织结构

x9yBXT

创建employee表并将一些数据插入表中

CREATE TABLE employee (
	employee_id INT PRIMARY KEY,
	first_name VARCHAR (255) NOT NULL,
	last_name VARCHAR (255) NOT NULL,
	manager_id INT,
	FOREIGN KEY (manager_id)
	REFERENCES employee (employee_id)
	ON DELETE CASCADE
);
INSERT INTO employee (
	employee_id,
	first_name,
	last_name,
	manager_id
)
VALUES
	(1, 'Windy', 'Hays', NULL),
	(2, 'Ava', 'Christensen', 1),
	(3, 'Hassan', 'Conner', 1),
	(4, 'Anna', 'Reeves', 2),
	(5, 'Sau', 'Norman', 2),
	(6, 'Kelsie', 'Hays', 3),
	(7, 'Tory', 'Goff', 3),
	(8, 'Salley', 'Lester', 3);

使用自连接查询谁向谁报告

SELECT
    e.first_name || ' ' || e.last_name employee,
    m .first_name || ' ' || m .last_name manager
FROM
    employee e
INNER JOIN employee m ON m .employee_id = e.manager_id
ORDER BY manager;

1zBzNp

以上查询两次引用employee表,一次作为雇员,另一次作为经理,通过匹配employee_idmanager_id查找雇员/经理对

使用LEFT JOINinstead ofINNER JOIN查询结果集中包含最高管理者

SELECT
    e.first_name || ' ' || e.last_name employee,
    m .first_name || ' ' || m .last_name manager
FROM
    employee e
LEFT JOIN employee m ON m .employee_id = e.manager_id
ORDER BY manager;

7eG9pZ

比较同表的行

GRiyfG

查询所有长度相同的电影

SELECT
    f1.title,
    f2.title,
    f1.length
FROM
    film f1
INNER JOIN film f2
    ON f1.film_id <> f2.film_id AND
       f1.length = f2.length;

AFkjme

Comments

No Comments!